package tp.tecnicasdisenio.dao.impl.jdbc;

import java.sql.SQLException;
import java.util.ArrayList;

import tp.tecnicasdisenio.dao.DaoException;
import tp.tecnicasdisenio.dao.MensajeDaoInterface;
import tp.tecnicasdisenio.model.entity.MensajeSMTPMIME;

public class MensajeDao extends DaoAbstract implements MensajeDaoInterface {

	private static MensajeDao instance = null;

	private static final String MENSAJE_TABLA = "smtp_mime";

	private static final String COLUMNA_ID = "mime_id";

	private MensajeDao() {}

	public static MensajeDao getInstance() {
		if (instance == null) {
			instance = new MensajeDao();
		}
		return instance;
	}

	@Override
	public MensajeSMTPMIME getPorId(Integer id) {
		String queryString =
				"SELECT * FROM " + MENSAJE_TABLA + " WHERE " + COLUMNA_ID + "=?";
		MensajeSMTPMIME mensaje = null;
		try {
			connection = this.getConnection();

			preparedStatement = connection.prepareStatement(queryString);
			preparedStatement.setInt(1, id);
			resultSet = preparedStatement.executeQuery();

			if(resultSet.next()) {
				mensaje = new MensajeSMTPMIME();
				mensaje.setId(resultSet.getInt("mime_id"));
				mensaje.setMime(resultSet.getString("mime"));
				mensaje.setProcesado(resultSet.getBoolean("procesado"));
				mensaje.setAplicoARegla(resultSet.getBoolean("aplico_regla"));
			}
		} catch(SQLException e) {
			e.printStackTrace();
			throw (new DaoException("No se pudo obtener el mensaje" +
					" de la DB.", e));
		} finally {
			try {
				if (resultSet != null) {
					resultSet.close();
				}
				if (preparedStatement != null) {
					preparedStatement.close();
				}
				if (connection != null) {
					connection.close();
				}
			} catch(SQLException e) {
				e.printStackTrace();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		return mensaje;
	}

	@Override
	public ArrayList<MensajeSMTPMIME> obtenerTodos() {
		ArrayList<MensajeSMTPMIME> resultado = null;
		try {
			String queryString = "SELECT * FROM " + MENSAJE_TABLA;
			connection = this.getConnection();
			preparedStatement = connection.prepareStatement(queryString);
			resultSet = preparedStatement.executeQuery();

			resultado = new ArrayList<MensajeSMTPMIME>();
			MensajeSMTPMIME mensaje;

			while (resultSet.next()) {
				mensaje = new MensajeSMTPMIME();
				mensaje.setId(resultSet.getInt("mime_id"));
				mensaje.setMime(resultSet.getString("mime"));
				mensaje.setProcesado(resultSet.getBoolean("procesado"));
				mensaje.setAplicoARegla(resultSet.getBoolean("aplico_regla"));
				resultado.add(mensaje);
			}
		} catch(SQLException e) {
			e.printStackTrace();
			throw (new DaoException("No se pudieron obtener TODOS los mensajes" +
					" de la DB.", e));
		} finally {
			try {
				if (resultSet != null) {
					resultSet.close();
				}
				if (preparedStatement != null) {
					preparedStatement.close();
				}
				if (connection != null) {
					connection.close();
				}
			} catch(SQLException e) {
				e.printStackTrace();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		return resultado;
	}

	@Override
	public void borrar(MensajeSMTPMIME entidad) {
		try {
			String queryString = "DELETE FROM " + MENSAJE_TABLA + " WHERE " + COLUMNA_ID + "=?";
			connection = getConnection();
			preparedStatement = connection.prepareStatement(queryString);
			preparedStatement.setInt(1, entidad.getId());

			preparedStatement.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			throw (new DaoException(e));
		} finally {
			try {
				if (preparedStatement != null)
					preparedStatement.close();
				if (connection != null)
					connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	@Override
	public void actualizar(MensajeSMTPMIME entidad) {
		try{
			String queryString = "UPDATE " + MENSAJE_TABLA + " SET mime=?, procesado=?, aplico_regla=? WHERE mime_id=?";
			connection = getConnection();
			preparedStatement = connection.prepareStatement(queryString);
			preparedStatement.setString(1, entidad.getMime());
			preparedStatement.setBoolean(2, entidad.isProcesado());
			preparedStatement.setBoolean(3, entidad.isAplicoARegla());
			preparedStatement.setInt(4, entidad.getId());
			preparedStatement.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			throw (new DaoException(e));
		} finally {
			try {
				if (preparedStatement != null)
					preparedStatement.close();
				if (connection != null)
					connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}		
	}

	@Override
	public void insertar(MensajeSMTPMIME entidad) {
		String queryInsert = "INSERT INTO " + MENSAJE_TABLA +
				"(mime, procesado, aplico_regla) VALUES(?, ?, ?)";
		try {
			connection = getConnection();
			preparedStatement = connection.prepareStatement(queryInsert);
			preparedStatement.setString(1, entidad.getMime());
			preparedStatement.setBoolean(2, entidad.isProcesado());
			preparedStatement.setBoolean(3, entidad.isProcesado());

			preparedStatement.executeUpdate();

			// luego de insertarlo en la bd, seteo el valor de mimeId generado en la entidad
			preparedStatement = connection.prepareStatement("SELECT MAX(mime_id) FROM " + MENSAJE_TABLA);
			resultSet = preparedStatement.executeQuery();
			resultSet.first();
			entidad.setId(resultSet.getInt("MAX(mime_id)"));

		} catch(SQLException e) {
			e.printStackTrace();
			throw new DaoException("No se pudo insertar nuevo mensaje en la DB.", e);
		} finally {
			try {
				if (preparedStatement != null) {
					preparedStatement.close();
				}
				if (connection != null) {
					connection.close();
				}
			} catch(SQLException e) {
				e.printStackTrace();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
	}

	public ArrayList<MensajeSMTPMIME> obtenerMensajesNoProcesados() {
		ArrayList<MensajeSMTPMIME> resultado = null;
		try {
			String queryString = "SELECT * FROM " + MENSAJE_TABLA + " WHERE procesado = 0";
			connection = this.getConnection();
			preparedStatement = connection.prepareStatement(queryString);
			resultSet = preparedStatement.executeQuery();

			resultado = new ArrayList<MensajeSMTPMIME>();
			MensajeSMTPMIME mensaje;

			while (resultSet.next()) {
				mensaje = new MensajeSMTPMIME();
				mensaje.setId(resultSet.getInt("mime_id"));
				mensaje.setMime(resultSet.getString("mime"));
				mensaje.setProcesado(resultSet.getBoolean("procesado"));
				mensaje.setAplicoARegla(resultSet.getBoolean("aplico_regla"));
				resultado.add(mensaje);
			}
		} catch(SQLException e) {
			e.printStackTrace();
			throw (new DaoException("No se pudieron obtener TODOS los mensajes" +
					" de la DB.", e));
		} finally {
			try {
				if (resultSet != null) {
					resultSet.close();
				}
				if (preparedStatement != null) {
					preparedStatement.close();
				}
				if (connection != null) {
					connection.close();
				}
			} catch(SQLException e) {
				e.printStackTrace();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		return resultado;

	}
}
